Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

MengFanjun的博客

我是在这篇文章的基础上进行修改的,那篇文章只进行了串口的打印,并没有在LCD1602上显示

一、电路连接

LCD1602IIC

LCD1602IIC引脚 Arduino引脚
VCC 5V
GND GND
SDA A4
SCL A5

我这里的LCD1602是IIC的,所以只需要4根线

在这里插入图片描述

DS1302

DS1302引脚 Arduino引脚
VCC 5V
GND GND
RST A0(14)
DAT A1(15)
SCK A2(16)

二、代码

记得提前安装DS1302的库
DS1302

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <DS1302.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //引用I2C库

char buf1[50];
char buf2[50];

//设置LCD1602设备地址,这里的地址是0x27,一般是0x20,或者0x27,具体看模块手册
LiquidCrystal_I2C lcd(0x27,16,2); //这里是0x27
DS1302 rtc(14, 15, 16); //对应DS1302的RST,DAT,CLK

void initRTCTime(void)//初始化RTC时钟
{
rtc.writeProtect(false); //关闭写保护
rtc.halt(false); //清除时钟停止标志
Time t(2022, 12, 15, 17, 21, 50, 4); //新建时间对象 最后参数位星期数据,周日为1,周一为2以此类推
rtc.time(t);//向DS1302设置时间数据
}

void printTime()//打印时间数据
{
Time tim = rtc.time(); //从DS1302获取时间数据

snprintf(buf1, sizeof(buf1), "%04d-%02d-%02d ",
tim.yr, tim.mon, tim.date
);
snprintf(buf2, sizeof(buf2), "%02d:%02d:%02d",
tim.hr, tim.min, tim.sec);

Serial.println(buf1);
Serial.println(buf2);
}

void setup() {
Serial.begin(9600);

//新模块上电需要设置一次当前时间,
//下载完成后需屏蔽此函数再次下载,否则每次上电都会初始化时间数据
initRTCTime();
lcd.init(); // 初始化LCD
lcd.backlight(); //设置LCD背景等亮

lcd.setCursor(0,0);
lcd.print(" Clock ");
delay(2000);
lcd.clear();

}

void loop() {
printTime();
delay(1000);

Time tim = rtc.time(); //从DS1302获取时间数据
lcd.setCursor(0,0);
lcd.print(buf1);
lcd.setCursor(0,1);
lcd.print(buf2);
}

三、效果

请添加图片描述

评论